<?php
header("content-type:text/html;charset=utf-8");

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//-----------------------------工厂模式-------------------------//
class A{
	public $class;		// public $class = $_GET['c'];	//类名
	public $method;	// public $method = $_GET['m'];	//方法

	public function __construct($class,$method){
		$this->class = ucfirst(strtolower($class));	//对类名进行安全处理
		$this->method = strtolower($method);		//对方法名进行安全处理
		$this->work($this->class,$this->method);
	}
	public function work($class,$method){
		// 把文件命名成 （类名.class.php的形式），就可以通过类名找到文件。
		//include '文件名（文件在别的地方）';		#例如 include './index.php';	引入文件然后实例化类。
		$c = new $class;	//实例化类
		$c->$method();	//访问类的方法
	}
}

class B{
	public function ba(){
		echo '实例化后的ba方法<br>';
	}
	public function bb(){
		echo '实例化后的bb方法<br>';
	}
}

class C{
	public function ca(){
		echo '实例化后的ca方法<br>';
	}
	public function cb(){
		echo '实例化后的cb方法<br>';
	}
}

//工厂模式的实现
$a = new A('b','ba');		// 通过类访问方法
$a = new A('C','ca');		// 通过类访问方法

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------PHP 抽象工厂模式----------------------
interface Factory{
	public function A();
	public function B();
}
class Product1 implements Factory{
	public function A(){
		return new A1;
	}
	public function B(){
		return new B1;
	}
}
class Product2 implements Factory{
	public function A(){
		return new A2;
	}
	public function B(){
		return new B2;
	}
}

interface ColorA{
	public function color();
}
interface ColorB{
	public function color();
}

class A1 implements ColorA{
	public $color = 'A1的颜色是白色<br>';
	public function color(){
		return $this->color;
	}
}
class A2 implements ColorA{
	public $color = 'A2的颜色是黑色<br>';
	public function color(){
		return $this->color;
	}
}
class B1 implements ColorB{
	public $color = 'B1的颜色是白色<br>';
	public function color(){
		return $this->color;
	}
}
class B2 implements ColorB{
	public $color = 'B2的颜色是黑色<br>';
	public function color(){
		return $this->color;
	}
}
class Client{
	public static function main(){
		self::run(new Product1);
		self::run(new Product2);
	}
	public static function run(Factory $factory){
		$a = $factory->A();
		echo $a->color();

		$b = $factory->B();
		echo $b->color();
	}
}

Client::main();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

=====assign() 功能的实现  数组分配到模板。使用 extract() 函数。 变量分配到模板。使用 compact()

extract($arr);	//extract  的作用：从数组中将变量导入到当前的符号表，键做变量，值做值！
compact();	//  — 建立一个数组，包括变量名和它们的值 

class base{
	public $array;
	public $key;
	public $val;

	public function assign($key,$val){
		if(array($val)){
			$this->array["$key"] = $val;
		}else{
			$this->array["$key"] = compact($val);
		}
	}

	public function display($tpl){
		$this->assign($this->key,$this->val);
		extract($this->array);
		if(file_exists($tpl)){	//模板存在就加载文件。
			include $tpl;
		}
	}
}
class indexcontroller extends base{
	public function index(){
		$arr = array('a'=>'aaaaaaa','b'=>array('a'=>'111111','b'=>'22222','c'=>'3333'),'c'=>'ccccccc','d'=>'dddddd','e'=>'eeeee');
		$str = '我是字符串';
		$this->assign('arr',$arr);
		$this->assign('str',$str);
		$this->display('index.html');
	}
}
$base = new base;
$base->index();

|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||